/*
 * Copyright (C) 2000-2008 Jens Nixdorf and various contributors
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to
 * deal in the Software without restriction, including without limitation the
 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 * sell copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies of the Software, its documentation and marketing & publicity
 * materials, and acknowledgment shall be given in the documentation, materials
 * and software packages that this Software was used.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */
package org.mopore.jat.board;

import java.awt.AlphaComposite;
import java.awt.BasicStroke;
import java.awt.Composite;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

/**
 * MouseStrokePreview
 * 
 * @author Daniel Drachau, PRODYNA GmbH
 * @version $Id: $
 */
public class MouseStrokePreview extends MouseAdapter {

    int paintPictureCount = 70;

    int currentPictureCount = 70;

    private Point p;

    private Marking marking;

    @Override
    public void mouseMoved(MouseEvent e) {
        this.p = e.getPoint();
    }

    public void setNewStroke(Marking marking, Point p) {
        this.currentPictureCount = 0;
        this.marking = marking;
        this.p = p;
    }

    public void paint(final Graphics2D g2, final Composite origComposite) {
        if (this.currentPictureCount >= this.paintPictureCount)
            return;
        this.currentPictureCount++;

        g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, this.getAlpha()));
        g2.setColor(this.marking.getColor());
        g2.setStroke(new BasicStroke(this.marking.getSize(), BasicStroke.CAP_ROUND,
                BasicStroke.CAP_ROUND));
        g2.drawLine(this.p.x, this.p.y, this.p.x, this.p.y);

        g2.setComposite(origComposite);
    }

    public boolean isActive() {
        return this.currentPictureCount <= this.paintPictureCount;
    }

    private float getAlpha() {
        if (this.currentPictureCount < 26)
            return new Float(this.currentPictureCount * 0.03);
        else if (26 <= this.currentPictureCount && this.currentPictureCount < 46)
            return new Float(0.75);
        else
            return new Float((this.paintPictureCount - this.currentPictureCount) * 0.03);
    }
}
